home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 2 / Euroscene 2.iso / USEFUL / DeliTracker130 / Developer / Developer.run / Examples / FC1.4.s < prev    next >
Encoding:
Text File  |  1992-09-23  |  15.3 KB  |  827 lines

  1.  
  2.     incdir    "Includes:"
  3.     include    "misc/DeliPlayer.i"
  4.  
  5. ;
  6. ;
  7.     SECTION Player,Code
  8. ;
  9. ;
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: Future Composer 1.4 player module V2.0 (05 Sep 92)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_PlayerVersion,3
  18.     dc.l    DTP_PlayerName,PName
  19.     dc.l    DTP_Creator,CName
  20.     dc.l    DTP_Check2,Chk
  21.     dc.l    DTP_Interrupt,Int
  22.     dc.l    DTP_InitPlayer,InitPlay
  23.     dc.l    DTP_EndPlayer,EndPlay
  24.     dc.l    DTP_InitSound,InitSnd
  25.     dc.l    DTP_EndSound,RemSnd
  26.     dc.l    DTP_Volume,SetVol
  27.     dc.l    DTP_Balance,SetVol
  28.     dc.l    TAG_DONE
  29.  
  30. *-----------------------------------------------------------------------*
  31. ;
  32. ; Player/Creatorname und lokale Daten
  33.  
  34. PName    dc.b 'FutureComposer_1.4',0
  35. CName    dc.b 'SuperSero of the Superions,',10
  36.     dc.b 'adapted by Delirium',0
  37.     even
  38. MODULE        dc.l 0
  39. fc_songend    dc.l 0
  40.  
  41. fc_SndLVol    dc.w 0
  42. fc_SndRVol    dc.w 0
  43.  
  44. *-----------------------------------------------------------------------*
  45. ;
  46. ;Interrupt für Replay
  47.  
  48. Int
  49.     movem.l    d0-d7/a0-a6,-(sp)
  50.  
  51.     ; bug in the original replayroutine !!!
  52.     moveq    #6,d6
  53.     ; you will hear strange noises if you don't include this instruction !
  54.  
  55.     jsr    PLAY                ; DudelDiDum
  56.     movem.l    (sp)+,d0-d7/a0-a6
  57.     rts
  58.  
  59. *-----------------------------------------------------------------------*
  60. ;
  61. ; Testet auf Modul
  62.  
  63. Chk                        ; FC 1.4 ?
  64.     move.l    dtg_ChkData(a5),a0
  65.     move.l    (a0),d0
  66.     subi.l    #"FC14",d0
  67.     rts
  68.  
  69. *-----------------------------------------------------------------------*
  70. ;
  71. ; Init Player
  72.  
  73. InitPlay
  74.     moveq    #0,d0
  75.     move.l    dtg_GetListData(a5),a0        ; Function
  76.     jsr    (a0)
  77.     move.l    a0,MODULE
  78.  
  79.     move.l    dtg_SongEnd(a5),fc_songend    ; store Songend FunctionPtr
  80.  
  81.     move.l    dtg_AudioAlloc(a5),a0        ; Function
  82.     jsr    (a0)                ; returncode is already set !
  83.     rts
  84.  
  85. *-----------------------------------------------------------------------*
  86. ;
  87. ; End Player
  88.  
  89. EndPlay
  90.     move.l    dtg_AudioFree(a5),a0        ; Function
  91.     jsr    (a0)
  92.     rts
  93.  
  94. *-----------------------------------------------------------------------*
  95. ;
  96. ; Init Sound
  97.  
  98. InitSnd
  99.     jsr    INIT_MUSIC            ; Init Sound
  100.     rts
  101.  
  102. *-----------------------------------------------------------------------*
  103. ;
  104. ; Remove Sound
  105.  
  106. RemSnd
  107.     jsr    END_MUSIC            ; End Sound
  108.     rts
  109.  
  110. *-----------------------------------------------------------------------*
  111. ;
  112. ; Copy Volume and Balance Data to internal buffer
  113.  
  114. SetVol
  115.     move.w    dtg_SndLBal(a5),d0
  116.     mulu    dtg_SndVol(a5),d0
  117.     lsr.w    #6,d0
  118.     move.w    d0,fc_SndLVol            ; Left Volume
  119.  
  120.     move.w    dtg_SndRBal(a5),d0
  121.     mulu    dtg_SndVol(a5),d0
  122.     lsr.w    #6,d0
  123.     move.w    d0,fc_SndRVol            ; Right Volume
  124.     rts
  125.  
  126. *-----------------------------------------------------------------------*
  127. ;
  128. ; FUTURE COMPOSER-Replay 1.4
  129.  
  130. ;
  131. ;
  132.     SECTION    Replay,Code_C
  133. ;
  134. ;
  135.  
  136. *********************************************************
  137. **  Amiga FUTURE COMPOSER  »» V1.4 ««  Replay routine  **
  138. *********************************************************
  139.  
  140. ;Doesn't work with V1.0 - V1.3 modules !!
  141.  
  142.  
  143. END_MUSIC:
  144.     clr.w onoff
  145.     clr.l $dff0a6
  146.     clr.l $dff0b6
  147.     clr.l $dff0c6
  148.     clr.l $dff0d6
  149.     move.w #$000f,$dff096
  150. ;    bclr #1,$bfe001
  151.     rts
  152.  
  153. INIT_MUSIC:
  154.     move.w #1,onoff
  155. ;    bset #1,$bfe001
  156.     move.l MODULE,a0
  157.     lea 180(a0),a1
  158.     move.l a1,SEQpoint
  159.     move.l a0,a1
  160.     add.l 8(a0),a1
  161.     move.l a1,PATpoint
  162.     move.l a0,a1
  163.     add.l 16(a0),a1
  164.     move.l a1,FRQpoint
  165.     move.l a0,a1
  166.     add.l 24(a0),a1
  167.     move.l a1,VOLpoint
  168.     move.l 4(a0),d0
  169.     divu #13,d0
  170.  
  171.     lea 40(a0),a1
  172.     lea SOUNDINFO+4(pc),a2
  173.     moveq #10-1,d1
  174. initloop:
  175.     move.w (a1)+,(a2)+
  176.     move.l (a1)+,(a2)+
  177.     adda.w #10,a2
  178.     dbf d1,initloop
  179.     move.l a0,d1
  180.     add.l 32(a0),d1
  181.     lea SOUNDINFO(pc),a3
  182.     move.l d1,(a3)+
  183.     moveq #9-1,d3
  184.     moveq #0,d2
  185. initloop1:
  186.     move.w (a3),d2
  187.     add.l d2,d1
  188.     add.l d2,d1
  189.     addq.l #2,d1
  190.     adda.w #12,a3
  191.     move.l d1,(a3)+
  192.     dbf d3,initloop1
  193.  
  194.     lea 100(a0),a1
  195.     lea SOUNDINFO+(10*16)(pc),a2
  196.     move.l a0,a3
  197.     add.l 36(a0),a3
  198.  
  199.     moveq #80-1,d1
  200.     moveq #0,d2
  201. initloop2:
  202.     move.l a3,(a2)+
  203.     move.b (a1)+,d2
  204.     move.w d2,(a2)+
  205.     clr.w (a2)+
  206.     move.w d2,(a2)+
  207.     addq.w #6,a2
  208.     add.w d2,a3
  209.     add.w d2,a3
  210.     dbf d1,initloop2
  211.  
  212.     move.l SEQpoint(pc),a0
  213.     moveq #0,d2
  214.     move.b 12(a0),d2        ;Get replay speed
  215.     bne.s speedok
  216.     move.b #3,d2            ;Set default speed
  217. speedok:
  218.     move.w d2,respcnt        ;Init repspeed counter
  219.     move.w d2,repspd
  220. INIT2:
  221.     clr.w audtemp
  222.     clr.w spdtemp
  223.     move.w #$000f,$dff096        ;Disable audio DMA
  224.     move.w #$0780,$dff09a        ;Disable audio IRQ
  225.     moveq #0,d7
  226.     mulu #13,d0
  227.     moveq #4-1,d6            ;Number of soundchannels-1
  228.     lea V1data(pc),a0        ;Point to 1st voice data area
  229.     lea silent(pc),a1
  230.     lea Chandata(pc),a2
  231. initloop3:
  232.     move.l a1,10(a0)
  233.     move.l a1,18(a0)
  234.     clr.w 4(a0)
  235.     move.w #$000d,6(a0)
  236.     clr.w 8(a0)
  237.     clr.l 14(a0)
  238.     move.b #$01,23(a0)
  239.     move.b #$01,24(a0)
  240.     clr.b 25(a0)
  241.     clr.l 26(a0)
  242.     clr.w 30(a0)
  243.     clr.l 38(a0)
  244.     clr.w 42(a0)
  245.     clr.l 44(a0)
  246.     clr.l 48(a0)
  247.     clr.w 56(a0)
  248.     moveq #$00,d3
  249.     move.w (a2)+,d1
  250.     move.w (a2),d3
  251.     divu #$0003,d3
  252.     moveq #0,d4
  253.     bset d3,d4
  254.     move.w d4,32(a0)
  255.     move.w (a2)+,d3
  256.     andi.l #$00ff,d3
  257.     andi.l #$00ff,d1
  258.     lea $dff0a0,a6
  259.     add.w d1,a6
  260.     move.l #$0000,(a6)
  261.     move.w #$0100,4(a6)
  262.     move.w #$0000,6(a6)
  263.     move.w #$0000,8(a6)
  264.     move.l a6,60(a0)
  265.     move.l SEQpoint(pc),(a0)
  266.     move.l SEQpoint(pc),52(a0)
  267.     add.l d0,52(a0)
  268.     add.l d3,52(a0)
  269.     add.l d7,(a0)
  270.     add.l d3,(a0)
  271.     move.l (a0),a3
  272.     move.b (a3),d1
  273.     andi.l #$00ff,d1
  274.     lsl.w #6,d1
  275.     move.l PATpoint(pc),a4
  276.     adda.w d1,a4
  277.     move.l a4,34(a0)
  278.     move.b 1(a3),44(a0)
  279.     move.b 2(a3),22(a0)
  280.     lea $4a(a0),a0        ;Point to next voice's data area
  281.     dbf d6,initloop3
  282.     rts
  283.  
  284.  
  285. PLAY:
  286.     lea audtemp(pc),a5
  287.     tst.w 8(a5)
  288.     bne.s music_on
  289.     rts
  290. music_on:
  291.     subq.w #1,4(a5)            ;Decrease replayspeed counter
  292.     bne.s nonewnote
  293.     move.w 6(a5),4(a5)        ;Restore replayspeed counter
  294.     moveq #0,d5
  295.     moveq #6,d6
  296.     lea V1data(pc),a0        ;Point to voice1 data area
  297.     bsr new_note
  298.     lea V2data(pc),a0        ;Point to voice2 data area
  299.     bsr new_note
  300.     lea V3data(pc),a0        ;Point to voice3 data area
  301.     bsr new_note
  302.     lea V4data(pc),a0        ;Point to voice4 data area
  303.     bsr new_note
  304. nonewnote:
  305.     clr.w (a5)
  306.     lea $dff000,a6
  307.     lea V1data(pc),a0
  308.     bsr effects
  309.     move.w fc_SndLVol,d1        ; added by Delirium
  310.     bsr fc_volbal            ;
  311.     move.l d0,$a6(a6)
  312.     lea V2data(pc),a0
  313.     bsr effects
  314.     move.w fc_SndRVol,d1        ; added by Delirium
  315.     bsr fc_volbal            ;
  316.     move.l d0,$b6(a6)
  317.     lea V3data(pc),a0
  318.     bsr effects
  319.     move.w fc_SndRVol,d1        ; added by Delirium
  320.     bsr fc_volbal            ;
  321.     move.l d0,$c6(a6)
  322.     lea V4data(pc),a0
  323.     bsr effects
  324.     move.w fc_SndLVol,d1        ; added by Delirium
  325.     bsr fc_volbal            ;
  326.     move.l d0,$d6(a6)
  327.     lea V1data(pc),a0
  328.     move.l 68+(0*74)(a0),a1        ;Get samplepointer
  329.     adda.w 64+(0*74)(a0),a1        ;add repeat_start
  330.     move.l 68+(1*74)(a0),a2
  331.     adda.w 64+(1*74)(a0),a2
  332.     move.l 68+(2*74)(a0),a3
  333.     adda.w 64+(2*74)(a0),a3
  334.     move.l 68+(3*74)(a0),a4
  335.     adda.w 64+(3*74)(a0),a4
  336.     move.w 66+(0*74)(a0),d1        ;Get repeat_length
  337.     move.w 66+(1*74)(a0),d2
  338.     move.w 66+(2*74)(a0),d3
  339.     move.w 66+(3*74)(a0),d4
  340.     moveq #2,d0
  341.     moveq #0,d5
  342.     move.w (a5),d7
  343.     ori.w #$8000,d7            ;Set/clr bit = 1
  344.     move.w d7,$dff096        ;Enable audio DMA
  345. chan1:
  346.     lea V1data+72(pc),a0
  347.     move.w (a0),d7
  348.     beq.s chan2
  349.     subq.w #1,(a0)
  350.     cmp.w d0,d7
  351.     bne.s chan2
  352.     move.w d5,(a0)
  353.     move.l a1,$a0(a6)        ;Set samplestart
  354.     move.w d1,$a4(a6)        ;Set samplelength
  355. chan2:
  356.     lea V2data+72(pc),a0
  357.     move.w (a0),d7
  358.     beq.s chan3
  359.     subq.w #1,(a0)
  360.     cmp.w d0,d7
  361.     bne.s chan3
  362.     move.w d5,(a0)
  363.     move.l a2,$b0(a6)
  364.     move.w d2,$b4(a6)
  365. chan3:
  366.     lea V3data+72(pc),a0
  367.     move.w (a0),d7
  368.     beq.s chan4
  369.     subq.w #1,(a0)
  370.     cmp.w d0,d7
  371.     bne.s chan4
  372.     move.w d5,(a0)
  373.     move.l a3,$c0(a6)
  374.     move.w d3,$c4(a6)
  375. chan4:
  376.     lea V4data+72(pc),a0
  377.     move.w (a0),d7
  378.     beq.s endplay
  379.     subq.w #1,(a0)
  380.     cmp.w d0,d7
  381.     bne.s endplay
  382.     move.w d5,(a0)
  383.     move.l a4,$d0(a6)
  384.     move.w d4,$d4(a6)
  385. endplay:
  386.     rts
  387.  
  388. new_note:
  389.     move.l 34(a0),a1
  390.     adda.w 40(a0),a1
  391.     cmp.b #$49,(a1)        ;Check "END" mark in pattern
  392.     beq.s patend
  393.     cmp.w #64,40(a0)        ;Have all the notes been played?
  394.     bne samepat
  395. patend:
  396.     move.w d5,40(a0)
  397.     move.l (a0),a2
  398.     adda.w 6(a0),a2        ;Point to next sequence row
  399.     cmpa.l 52(a0),a2    ;Is it the end?
  400.     bne.s notend
  401.     move.l    fc_songend,a2
  402.     jsr    (a2)        ; signal songend to DeliTracker
  403.     move.w d5,6(a0)        ;yes!
  404.     move.l (a0),a2        ;Point to first sequence
  405. notend:
  406.     lea spdtemp(pc),a3
  407.     moveq #1,d1
  408.     addq.b #1,(a3)
  409.     cmpi.b #5,(a3)
  410.     bne.s nonewspd
  411.     move.b d1,(a3)
  412.     move.b 12(a2),d1    ;Get new replay speed
  413.     beq.s nonewspd
  414.     move.w d1,2(a3)        ;store in counter
  415.     move.w d1,4(a3)
  416. nonewspd:
  417.     move.b (a2)+,d1        ;Pattern to play
  418.     move.b (a2)+,44(a0)    ;Transpose value
  419.     move.b (a2)+,22(a0)    ;Soundtranspose value
  420.     lsl.w d6,d1
  421.     move.l PATpoint(pc),a1    ;Get pattern pointer
  422.     add.w d1,a1
  423.     move.l a1,34(a0)
  424.     addi.w #$000d,6(a0)
  425. samepat:
  426.     move.b 1(a1),d1        ;Get info byte
  427.     move.b (a1)+,d0        ;Get note
  428.     bne.s ww1
  429.     andi.w #%11000000,d1
  430.     beq.s noport
  431.     bra.s ww11
  432. ww1:
  433.     move.w d5,56(a0)
  434. ww11:
  435.     move.b d5,47(a0)
  436.     btst #7,d1
  437.     beq.s noport
  438.     move.b 2(a1),47(a0)    
  439. noport:
  440.     andi.w #$007f,d0
  441.     beq nextnote
  442.     move.b d0,8(a0)
  443.     move.b (a1),d1
  444.     move.b d1,9(a0)
  445.     move.w 32(a0),d3
  446.     or.w d3,(a5)
  447.     move.w d3,$dff096
  448.     andi.w #$003f,d1    ;Max 64 instruments
  449.     add.b 22(a0),d1        ;add Soundtranspose
  450.     move.l VOLpoint(pc),a2
  451.     lsl.w d6,d1
  452.     adda.w d1,a2
  453.     move.w d5,16(a0)
  454.     move.b (a2),23(a0)
  455.     move.b (a2)+,24(a0)
  456.     moveq #0,d1
  457.     move.b (a2)+,d1
  458.     move.b (a2)+,27(a0)
  459.     move.b #$40,46(a0)
  460.     move.b (a2),28(a0)
  461.     move.b (a2)+,29(a0)
  462.     move.b (a2)+,30(a0)
  463.     move.l a2,10(a0)
  464.     move.l FRQpoint(pc),a2
  465.     lsl.w d6,d1
  466.     adda.w d1,a2
  467.     move.l a2,18(a0)
  468.     move.w d5,50(a0)
  469.     move.b d5,25(a0)
  470.     move.b d5,26(a0)
  471. nextnote:
  472.     addq.w #2,40(a0)
  473.     rts
  474.  
  475. effects:
  476.     moveq #0,d7
  477. testsustain:
  478.     tst.b 26(a0)        ;Is sustain counter = 0
  479.     beq.s sustzero
  480.     subq.b #1,26(a0)    ;if no, decrease counter
  481.     bra VOLUfx
  482. sustzero:        ;Next part of effect sequence
  483.     move.l 18(a0),a1    ;can be executed now.
  484.     adda.w 50(a0),a1
  485. testeffects:
  486.     cmpi.b #$e1,(a1)    ;E1 = end of FREQseq sequence
  487.     beq VOLUfx
  488.     move.b (a1),d0
  489.     cmpi.b #$e0,d0        ;E0 = loop to other part of sequence
  490.     bne.s testnewsound
  491.     move.b 1(a1),d1        ;loop to start of sequence + 1(a1)
  492.     andi.w #$003f,d1
  493.     move.w d1,50(a0)
  494.     move.l 18(a0),a1
  495.     adda.w d1,a1
  496.     move.b (a1),d0
  497. testnewsound:
  498.     cmpi.b #$e2,d0        ;E2 = set waveform
  499.     bne.s testE4
  500.     move.w 32(a0),d1
  501.     or.w d1,(a5)
  502.     move.w d1,$dff096
  503.     moveq #0,d0
  504.     move.b 1(a1),d0
  505.     lea SOUNDINFO(pc),a4
  506.     lsl.w #4,d0
  507.     adda.w d0,a4
  508.     move.l 60(a0),a3
  509.     move.l (a4)+,d1
  510.     move.l d1,(a3)
  511.     move.l d1,68(a0)
  512.     move.w (a4)+,4(a3)
  513.     move.l (a4),64(a0)
  514.     move.w #$0003,72(a0)
  515.     move.w d7,16(a0)
  516.     move.b #$01,23(a0)
  517.     addq.w #2,50(a0)
  518.     bra transpose
  519. testE4:
  520.     cmpi.b #$e4,d0
  521.     bne.s testE9
  522.     moveq #0,d0
  523.     move.b 1(a1),d0
  524.     lea SOUNDINFO(pc),a4
  525.     lsl.w #4,d0
  526.     adda.w d0,a4
  527.     move.l 60(a0),a3
  528.     move.l (a4)+,d1
  529.     move.l d1,(a3)
  530.     move.l d1,68(a0)
  531.     move.w (a4)+,4(a3)
  532.     move.l (a4),64(a0)
  533.     move.w #$0003,72(a0)
  534.     addq.w #2,50(a0)
  535.     bra transpose
  536. testE9:
  537.     cmpi.b #$e9,d0
  538.     bne testpatjmp
  539.     move.w 32(a0),d1
  540.     or.w d1,(a5)
  541.     move.w d1,$dff096
  542.     moveq #0,d0
  543.     move.b 1(a1),d0
  544.     lea SOUNDINFO(pc),a4
  545.     lsl.w #4,d0
  546.     adda.w d0,a4
  547.     move.l (a4),a2
  548.     cmpi.l #"SSMP",(a2)+
  549.     bne.s nossmp
  550.     lea 320(a2),a4
  551.     moveq #0,d1
  552.     move.b 2(a1),d1
  553.     lsl.w #4,d1
  554.     add.w d1,a2
  555.     add.l (a2),a4
  556.     move.l 60(a0),a3
  557.     move.l a4,(a3)
  558.     move.l 4(a2),4(a3)
  559.     move.l a4,68(a0)
  560.     move.l 6(a2),64(a0)
  561.     move.w d7,16(a0)
  562.     move.b #1,23(a0)
  563.     move.w #3,72(a0)
  564. nossmp:
  565.     addq.w #3,50(a0)
  566.     bra.s transpose
  567. testpatjmp:
  568.     cmpi.b #$e7,d0
  569.     bne.s testpitchbend
  570.     moveq #0,d0
  571.     move.b 1(a1),d0
  572.     lsl.w d6,d0
  573.     move.l FRQpoint(pc),a1
  574.     adda.w d0,a1
  575.     move.l a1,18(a0)
  576.     move.w d7,50(a0)
  577.     bra testeffects
  578. testpitchbend:
  579.     cmpi.b #$ea,d0
  580.     bne.s testnewsustain
  581.     move.b 1(a1),4(a0)
  582.     move.b 2(a1),5(a0)
  583.     addq.w #3,50(a0)
  584.     bra.s transpose
  585. testnewsustain:
  586.     cmpi.b #$e8,d0
  587.     bne.s testnewvib
  588.     move.b 1(a1),26(a0)
  589.     addq.w #2,50(a0)
  590.     bra testsustain
  591. testnewvib:
  592.     cmpi.b #$e3,(a1)+
  593.     bne.s transpose
  594.     addq.w #3,50(a0)
  595.     move.b (a1)+,27(a0)
  596.     move.b (a1),28(a0)
  597. transpose:
  598.     move.l 18(a0),a1
  599.     adda.w 50(a0),a1
  600.     move.b (a1),43(a0)
  601.     addq.w #1,50(a0)
  602.  
  603. VOLUfx:
  604.     tst.b 25(a0)
  605.     beq.s volsustzero
  606.     subq.b #1,25(a0)
  607.     bra calcperiod
  608. volsustzero:
  609.     tst.b 15(a0)
  610.     bne.s do_VOLbend
  611.     subq.b #1,23(a0)
  612.     bne.s calcperiod
  613.     move.b 24(a0),23(a0)
  614. volu_cmd:
  615.     move.l 10(a0),a1
  616.     adda.w 16(a0),a1
  617.     move.b (a1),d0
  618. testvoluend:
  619.     cmpi.b #$e1,d0
  620.     beq.s calcperiod
  621.     cmpi.b #$ea,d0
  622.     bne.s testVOLsustain
  623.     move.b 1(a1),14(a0)
  624.     move.b 2(a1),15(a0)
  625.     addq.w #3,16(a0)
  626.     bra.s do_VOLbend
  627. testVOLsustain:
  628.     cmpi.b #$e8,d0
  629.     bne.s testVOLloop
  630.     addq.w #2,16(a0)
  631.     move.b 1(a1),25(a0)
  632.     bra.s calcperiod
  633. testVOLloop:
  634.     cmpi.b #$e0,d0
  635.     bne.s setvolume
  636.     move.b 1(a1),d0
  637.     andi.w #$003f,d0
  638.     subq.b #5,d0
  639.     move.w d0,16(a0)
  640.     bra.s volu_cmd
  641. do_VOLbend:
  642.     not.b 38(a0)
  643.     beq.s calcperiod
  644.     subq.b #1,15(a0)
  645.     move.b 14(a0),d1
  646.     add.b d1,45(a0)
  647.     bpl.s calcperiod
  648.     moveq #0,d1
  649.     move.b d1,15(a0)
  650.     move.b d1,45(a0)
  651.     bra.s calcperiod
  652. setvolume:
  653.     move.b (a1),45(a0)
  654.     addq.w #1,16(a0)
  655. calcperiod:
  656.     move.b 43(a0),d0
  657.     bmi.s lockednote
  658.     add.b 8(a0),d0
  659.     add.b 44(a0),d0
  660. lockednote:
  661.     moveq #$7f,d1
  662.     and.l d1,d0
  663.     lea PERIODS(pc),a1
  664.     add.w d0,d0
  665.     move.w d0,d1
  666.     adda.w d0,a1
  667.     move.w (a1),d0
  668.  
  669.     move.b 46(a0),d7
  670.     tst.b 30(a0)        ;Vibrato_delay = zero ?
  671.     beq.s vibrator
  672.     subq.b #1,30(a0)
  673.     bra.s novibrato
  674. vibrator:
  675.     moveq #5,d2
  676.     move.b d1,d5
  677.     move.b 28(a0),d4
  678.     add.b d4,d4
  679.     move.b 29(a0),d1
  680.     tst.b d7
  681.     bpl.s vib1
  682.     btst #0,d7
  683.     bne.s vib4
  684. vib1:
  685.     btst d2,d7
  686.     bne.s vib2
  687.     sub.b 27(a0),d1
  688.     bcc.s vib3
  689.     bset d2,d7
  690.     moveq #0,d1
  691.     bra.s vib3
  692. vib2:
  693.     add.b 27(a0),d1
  694.     cmp.b d4,d1
  695.     bcs.s vib3
  696.     bclr d2,d7
  697.     move.b d4,d1
  698. vib3:
  699.     move.b d1,29(a0)
  700. vib4:
  701.     lsr.b #1,d4
  702.     sub.b d4,d1
  703.     bcc.s vib5
  704.     subi.w #$0100,d1
  705. vib5:
  706.     addi.b #$a0,d5
  707.     bcs.s vib7
  708. vib6:
  709.     add.w d1,d1
  710.     addi.b #$18,d5
  711.     bcc.s vib6
  712. vib7:
  713.     add.w d1,d0
  714. novibrato:
  715.     eori.b #$01,d7
  716.     move.b d7,46(a0)
  717.  
  718. ; DO THE PORTAMENTO THING
  719.     not.b 39(a0)
  720.     beq.s pitchbend
  721.     moveq #0,d1
  722.     move.b 47(a0),d1    ;get portavalue
  723.     beq.s pitchbend        ;0=no portamento
  724.     cmpi.b #$1f,d1
  725.     bls.s portaup
  726. portadown: 
  727.     andi.w #$1f,d1
  728.     neg.w d1
  729. portaup:
  730.     sub.w d1,56(a0)
  731. pitchbend:
  732.     not.b 42(a0)
  733.     beq.s addporta
  734.     tst.b 5(a0)
  735.     beq.s addporta
  736.     subq.b #1,5(a0)
  737.     moveq #0,d1
  738.     move.b 4(a0),d1
  739.     bpl.s pitchup
  740.     ext.w d1
  741. pitchup:
  742.     sub.w d1,56(a0)
  743. addporta:
  744.     add.w 56(a0),d0
  745.     cmpi.w #$0070,d0
  746.     bhi.s nn1
  747.     move.w #$0071,d0
  748. nn1:
  749.     cmpi.w #$0d60,d0
  750.     bls.s nn2
  751.     move.w #$0d60,d0
  752. nn2:
  753.     swap d0
  754.     move.b 45(a0),d0
  755.     rts
  756.  
  757.  
  758.  
  759. V1data:  dcb.b 64,0    ;Voice 1 data area
  760. offset1: dcb.b 02,0    ;Is added to start of sound
  761. ssize1:  dcb.b 02,0    ;Length of sound
  762. start1:  dcb.b 06,0    ;Start of sound
  763.  
  764. V2data:  dcb.b 64,0    ;Voice 2 data area
  765. offset2: dcb.b 02,0
  766. ssize2:  dcb.b 02,0
  767. start2:  dcb.b 06,0
  768.  
  769. V3data:  dcb.b 64,0    ;Voice 3 data area
  770. offset3: dcb.b 02,0
  771. ssize3:  dcb.b 02,0
  772. start3:  dcb.b 06,0
  773.  
  774. V4data:  dcb.b 64,0    ;Voice 4 data area
  775. offset4: dcb.b 02,0
  776. ssize4:  dcb.b 02,0
  777. start4:  dcb.b 06,0
  778.  
  779. audtemp: dc.w 0        ;DMACON
  780. spdtemp: dc.w 0
  781. respcnt: dc.w 0        ;Replay speed counter 
  782. repspd:  dc.w 0        ;Replay speed counter temp
  783. onoff:   dc.w 0        ;Music on/off flag.
  784.  
  785. Chandata: dc.l $00000000,$00100003,$00200006,$00300009
  786. SEQpoint: dc.l 0
  787. PATpoint: dc.l 0
  788. FRQpoint: dc.l 0
  789. VOLpoint: dc.l 0
  790.  
  791.  
  792. silent: dc.w $0100,$0000,$0000,$00e1
  793.  
  794. PERIODS:dc.w $06b0,$0650,$05f4,$05a0,$054c,$0500,$04b8,$0474
  795.     dc.w $0434,$03f8,$03c0,$038a,$0358,$0328,$02fa,$02d0
  796.     dc.w $02a6,$0280,$025c,$023a,$021a,$01fc,$01e0,$01c5
  797.     dc.w $01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d
  798.     dc.w $010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be,$00b4
  799.     dc.w $00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
  800.     dc.w $0071,$0071,$0071,$0071,$0071,$0071,$0071,$0071
  801.     dc.w $0071,$0071,$0071,$0071,$0d60,$0ca0,$0be8,$0b40
  802.     dc.w $0a98,$0a00,$0970,$08e8,$0868,$07f0,$0780,$0714
  803.     dc.w $1ac0,$1940,$17d0,$1680,$1530,$1400,$12e0,$11d0
  804.     dc.w $10d0,$0fe0,$0f00,$0e28,$06b0,$0650,$05f4,$05a0
  805.     dc.w $054c,$0500,$04b8,$0474,$0434,$03f8,$03c0,$038a
  806.     dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a
  807.     dc.w $021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d,$0168
  808.     dc.w $0153,$0140,$012e,$011d,$010d,$00fe,$00f0,$00e2
  809.     dc.w $00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f
  810.     dc.w $0087,$007f,$0078,$0071
  811.  
  812. SOUNDINFO:
  813. ;Start.l , Length.w , Repeat start.w , Repeat-length.w , blk.b 6,0 
  814.  
  815.     dcb.b 10*16,0    ;Reserved for samples
  816.     dcb.b 80*16,0    ;Reserved for waveforms
  817.  
  818.  
  819. fc_volbal                    ; added by Delirium
  820.     moveq    #0,d7                ;
  821.     move.b    d0,d7                ;
  822.     mulu    d1,d7                ;
  823.     lsr.w    #6,d7                ;
  824.     move.w    d7,d0                ; volume
  825.     rts
  826.  
  827.